home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 247_02 / miracl.h < prev    next >
Text File  |  1989-04-17  |  10KB  |  149 lines

  1. /*
  2.  *   main MIRACL header - miracl.h.
  3.  *   Use this file unmodified as main 'miracl.h' header if  using
  4.  *   an ANSI enhanced type C compiler. This will cause
  5.  *   the compiler to generate a warning if you call  a
  6.  *   function with the wrong type of parameter - very useful.
  7.  *
  8.  *   If using an older compiler, delete the parameter declarations
  9.  *   e.g. change  - extern void berror(int);
  10.  *            to  - extern void berror();
  11.  */
  12.  
  13. #include "mirdef.h"
  14.  
  15. /* big and flash variables consist of an array of smalls */
  16.  
  17. typedef small *big;
  18. typedef small *flash;
  19.  
  20. extern bool WRAP;    /* =ON for wraparound on output, else =OFF      */
  21. extern bool ERCON;   /* error control, TRUE for user processing      */
  22. extern int  ERNUM;   /* last recorded error       */
  23. extern bool STROUT;  /* redirect output to OBUFF  */
  24. extern int  IOBASE;  /* base for I/O       */
  25. extern int  LINE;    /* Output line length */ 
  26. extern unsigned char OBUFF[]; /* Output buffer      */
  27. extern unsigned char IBUFF[]; /* Input buffer       */
  28. extern bool POINT;   /* =ON for radix point, =OFF for fractions      */
  29. extern bool EXACT;   /* exact flag         */
  30. extern int  NTRY;    /* no. of tries for prob. primality testing     */
  31. extern bool TRACER;  /* turns track tracer on/off                    */
  32. extern int  INPLEN;  /* input length (for binary input)              */
  33.  
  34. /* Function definition  */
  35.  
  36. /* Group 0 - Internal routines */
  37.  
  38. extern void  berror(int);                  /* MIRACL error routine           */
  39. extern void  setbase(small);               /* set internal number base       */
  40. extern void  track(void);                  /* routine tracker                */
  41. extern void  lzero(big);                   /* suppress leading zeros         */
  42. extern bool  notint(flash);                /* tests for flash or big         */
  43. extern int   lent(flash);                  /* length of big/flash            */
  44. extern void  padd(big,big,big);            /* primitive add                  */
  45. extern void  psub(big,big,big);            /* primitive subtract             */
  46. extern void  select(big,int,big,big);      /* selects padd or psub           */
  47. extern void  shift(big,int,big);           /* shift left or right            */ 
  48. extern small muldiv(small,small,small,small,small *);
  49.                                            /* int multiply, add and divide   */
  50. extern small igcd(small,small);            /* integer GCD                    */
  51. extern small isqrt(small,small);           /* integer square root            */
  52.  
  53. /* Group 1 - General purpose, I/O and basic arithmetic routines  */
  54.  
  55. extern void  irand(long);                  /* initialize random numbers      */
  56. extern small brand(void);                  /* integer random numbers         */
  57. extern void  zero(flash);                  /* set flash number to zero       */
  58. extern void  convert(small,big);           /* convert int number to big      */
  59. extern void  lconv(long,big);              /* convert long to big            */
  60. extern flash mirvar(small);                /* initialize big/flash number    */
  61. extern void  mirsys(int,small);            /* initialize system              */
  62. extern int   exsign(flash);                /* extract sign of flash number   */
  63. extern void  insign(int,flash);            /* assert sign of flash number    */
  64. extern int   getdig(big,int);              /* extract digit from big number  */
  65. extern int   numdig(big);                  /* return number of digits in big */
  66. extern void  putdig(int,big,int);          /* insert digit into big number   */
  67. extern void  copy(flash,flash);            /* copy one flash to another      */
  68. extern void  negate(flash,flash);          /* negate flash number            */
  69. extern void  absol(flash,flash);           /* absolute value of flash number */
  70. extern int   size(big);                    /* convert big number to int      */
  71. extern void  fpack(big,big,flash);         /* make flash number from bigs    */
  72. extern void  numer(flash,big);             /* extract flash numerator        */
  73. extern void  denom(flash,big);             /* extract flash denominator      */
  74. extern int   compare(big,big);             /* compare two big numbers        */
  75. extern void  add(big,big,big);             /* add two big numbers            */
  76. extern void  subtract(big,big,big);        /* subtract two big numbers       */
  77. extern void  incr(big,small,big);          /* add int number to big          */
  78. extern void  decr(big,small,big);          /* subtract int number from big   */
  79. extern void  premult(big,small,big);       /* multiply big number by int     */
  80. extern small subdiv(big,small,big);        /* divide big number by int       */
  81. extern void  multiply(big,big,big);        /* multiply two big numbers       */
  82. extern void  divide(big,big,big);          /* divide big number by another   */
  83. extern void  mad(big,big,big,big,big,big); /* multiply, add and divide       */
  84. extern void  build(flash,int (*)());       /* build flash from c.f generator */
  85. extern void  round(big,big,flash);         /* make rounded flash from 2 bigs */
  86. extern int   innum(flash,FILE *);          /* input  flash number            */
  87. extern int   otnum(flash,FILE *);          /* output flash number            */
  88. extern int   cinnum(flash,FILE *);         /* input  flash number - any base */
  89. extern int   cotnum(flash,FILE *);         /* output flash number - any base */
  90.  
  91. /* Group 2 - Advanced arithmetic routines */
  92.  
  93. extern small smul(small,small,small);      /* multiply two ints mod int      */
  94. extern small spmd(small,small,small);      /* raise int to int power mod int */
  95. extern small inverse(small,small);         /* inverse mod a small            */
  96. extern small sqrmp(small,small);           /* square root mod a prime        */
  97. extern int  *gprime(int);                  /* prime number generator         */
  98. extern int   gcd(big,big,big);             /* find GCD of two big numbers    */
  99. extern int   xgcd(big,big,big,big,big);    /* extended GCD routine           */
  100. extern int   logb2(big);                   /* returns no. of bits in a big   */
  101. extern void  expb2(big,int);               /* raises 2 to int power          */
  102. extern void  power(big,int,big,big);       /* raise big to int power mod big */
  103. extern void  powmod(big,big,big,big);      /* raise big to big power mod big */
  104. extern bool  root(big,int,big);            /* find root of big number        */
  105. extern void  bigrand(big,big);             /* generate big random number     */
  106. extern void  bigdig(big,int,small);        /* find random big of fixed size  */
  107. extern bool  prime(big);                   /* test big number for primality  */
  108. extern void  nxprime(big,big);             /* find next big prime number     */
  109. extern void  strongp(big,int);             /* generate 'strong' prime        */
  110.  
  111. /* Group 3 - Floating-slash routines      */
  112.  
  113. extern void  flop(flash,flash,int *,flash);/* primitive flash operations     */
  114. extern void  fmul(flash,flash,flash);      /* multiply flash nos.            */
  115. extern void  fdiv(flash,flash,flash);      /* divide flash numbers           */
  116. extern void  fadd(flash,flash,flash);      /* add flash numbers              */
  117. extern void  fsub(flash,flash,flash);      /* subtract flash nos.            */
  118. extern int   fcomp(flash,flash);           /* compare flash numbers          */
  119. extern void  fconv(small,small,flash);     /* convert fraction to flash      */
  120. extern void  frecip(flash,flash);          /* flash reciprical               */
  121. extern void  ftrunc(flash,big,flash);      /* truncate flash number          */
  122. extern void fpmul(flash,small,small,flash);/* multiply flash by fraction     */
  123. extern void fincr(flash,small,small,flash);/* increment flash by fraction    */
  124. extern void  dconv(double,flash);          /* convert double to flash        */
  125. extern double fdsize(flash);               /* convert flash to double        */
  126. extern void  frand(flash);                 /* generates flash random 0<x<1   */
  127.  
  128. /* Group 4 - Advanced Flash routines */ 
  129.  
  130. extern void  fpower(flash,int,flash);      /* raises flash to inte